package com.rolerealm.common.util;

import com.rolerealm.common.constant.ErrorCode;
import com.rolerealm.common.exception.BaseException;
import com.rolerealm.common.result.Result;

/**
 * 返回结果工具类
 * 提供便捷的方法来创建返回结果
 * 
 * @author RoleRealm Team
 * @version 1.0.0
 */
public class ResultUtil {

    /**
     * 私有构造方法，防止实例化
     */
    private ResultUtil() {
        throw new UnsupportedOperationException("Utility class cannot be instantiated");
    }

    /**
     * 成功返回（无数据）
     * 
     * @return 成功结果
     */
    public static <T> Result<T> success() {
        return Result.success();
    }

    /**
     * 成功返回（带数据）
     * 
     * @param data 返回数据
     * @return 成功结果
     */
    public static <T> Result<T> success(T data) {
        return Result.success(data);
    }

    /**
     * 成功返回（自定义消息）
     * 
     * @param message 成功消息
     * @return 成功结果
     */
    public static <T> Result<T> success(String message) {
        return Result.success(message);
    }

    /**
     * 成功返回（自定义消息和数据）
     * 
     * @param message 成功消息
     * @param data 返回数据
     * @return 成功结果
     */
    public static <T> Result<T> success(String message, T data) {
        return Result.success(message, data);
    }

    /**
     * 失败返回（错误码枚举）
     * 
     * @param errorCode 错误码枚举
     * @return 失败结果
     */
    public static <T> Result<T> error(ErrorCode errorCode) {
        return Result.error(errorCode);
    }

    /**
     * 失败返回（错误码枚举和数据）
     * 
     * @param errorCode 错误码枚举
     * @param data 返回数据
     * @return 失败结果
     */
    public static <T> Result<T> error(ErrorCode errorCode, T data) {
        return Result.error(errorCode, data);
    }

    /**
     * 失败返回（自定义错误码和消息）
     * 
     * @param code 错误码
     * @param message 错误消息
     * @return 失败结果
     */
    public static <T> Result<T> error(int code, String message) {
        return Result.error(code, message);
    }

    /**
     * 失败返回（自定义错误码、消息和数据）
     * 
     * @param code 错误码
     * @param message 错误消息
     * @param data 返回数据
     * @return 失败结果
     */
    public static <T> Result<T> error(int code, String message, T data) {
        return Result.error(code, message, data);
    }

    /**
     * 根据条件返回成功或失败结果
     * 
     * @param condition 条件
     * @param successData 成功时的数据
     * @param errorCode 失败时的错误码
     * @return 结果
     */
    public static <T> Result<T> conditional(boolean condition, T successData, ErrorCode errorCode) {
        return condition ? success(successData) : error(errorCode);
    }

    /**
     * 根据条件返回成功或失败结果
     * 
     * @param condition 条件
     * @param successMessage 成功消息
     * @param successData 成功时的数据
     * @param errorCode 失败时的错误码
     * @return 结果
     */
    public static <T> Result<T> conditional(boolean condition, String successMessage, T successData, ErrorCode errorCode) {
        return condition ? success(successMessage, successData) : error(errorCode);
    }

    /**
     * 抛出业务异常
     * 
     * @param errorCode 错误码
     * @throws BaseException 业务异常
     */
    public static void throwException(ErrorCode errorCode) {
        throw new BaseException(errorCode);
    }

    /**
     * 抛出业务异常
     * 
     * @param errorCode 错误码
     * @param detail 错误详情
     * @throws BaseException 业务异常
     */
    public static void throwException(ErrorCode errorCode, String detail) {
        throw new BaseException(errorCode, detail);
    }

    /**
     * 抛出业务异常
     * 
     * @param errorCode 错误码
     * @param cause 原因异常
     * @throws BaseException 业务异常
     */
    public static void throwException(ErrorCode errorCode, Throwable cause) {
        throw new BaseException(errorCode, cause);
    }

    /**
     * 抛出业务异常
     * 
     * @param errorCode 错误码
     * @param detail 错误详情
     * @param cause 原因异常
     * @throws BaseException 业务异常
     */
    public static void throwException(ErrorCode errorCode, String detail, Throwable cause) {
        throw new BaseException(errorCode, detail, cause);
    }
}
